package com.java.basis.collection;

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

/**
 * TreeSet, LinkedHashSet and HashSet 的区别
 * TreeSet, LinkedHashSet and HashSet 在java中都是实现Set的数据结构
 * <p>
 * TreeSet的主要功能用于排序
 * LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
 * HashSet只是通用的存储数据的集合
 * <p>
 * 相同点：
 * Duplicates elements: 因为三者都实现Set interface，所以三者都不包含duplicate elements
 * Thread safety: 三者都不是线程安全的，如果要使用线程安全可以Collections.synchronizedSet()
 * 不同点：
 * Performance and Speed: HashSet插入数据最快，其次LinkHashSet，最慢的是TreeSet因为内部实现排序
 * <p>
 * Ordering: HashSet不保证有序，LinkHashSet保证FIFO即按插入顺序排序，TreeSet安装内部实现排序，也可以自定义排序规则
 * null:HashSet和LinkHashSet允许存在null数据，但是TreeSet中插入null数据时会报NullPointerException
 *
 * @author wangning
 * @create 2021-04-08 15:43
 */
public class TestTreeSetLinkedHashSet {
	public static void main(String[] args) {
		HashSet<String> hashSet = new HashSet<>();
		LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
		TreeSet<String> treeSet = new TreeSet<>();

		for (String data : Arrays.asList("B", "E", "D", "C", "A")) {
			hashSet.add(data);
			linkedHashSet.add(data);
			treeSet.add(data);
		}

		//不保证有序
		System.out.println("Ordering in HashSet :" + hashSet);

		//FIFO保证安装插入顺序排序
		System.out.println("Order of element in LinkedHashSet :" + linkedHashSet);

		//内部实现排序
		System.out.println("Order of objects in TreeSet :" + treeSet);

		//运行结果:
		//Ordering in HashSet :[A, B, C, D, E] (无顺序)
		//Order of element in LinkedHashSet :[B, E, D, C, A] (FIFO插入有序)
		//Order of objects in TreeSet :[A, B, C, D, E] (排序)

	}
}
